package futbol.tacticas.concursantes2007.SeteTeam.jugadores.facklab;

import futbol.tacticas.concursantes2007.SeteTeam.jugadores.*;
import futbol.tacticas.concursantes2007.SeteTeam.jugadores.geometria.Linea;

import java.awt.Point;
import java.awt.geom.Rectangle2D;
import java.util.Vector;

import futbol.tacticas.Comando;


/**
 * Implementa una tactica basica para los jugadores. Simplemente
 * el jugador si es el mas cercano a la bola va a por ella y si puede
 * dispara a puerta.
 * 
 * @author llua
 *
 */
public class TacticaDefensa  extends AbstractTacticaAreas{
	
	public TacticaDefensa(int numero, int xInicial, int yInicial, int fuerza, Rectangle2D area,final Entrenador entrenador) {
		super(numero, xInicial, yInicial, fuerza, area, entrenador);
	}
	
	protected void generarMovimiento(final Vector<Comando> comandos) {
		final Point bola=getSituacion().getBola();
		final double distBolaYo = bola.distance(getPosicion());
		final double distBolaPortero = bola.distance(getSituacion().getMisJugadores()[Entrenador.PORTERO]);
		final Point enemigo = getEnemigoBajoEnArea();
		
		if(isJugadorMasCercanoBola() || distBolaYo<20 || distBolaPortero<20){
    		comandos.add(irA(bola.getX() , bola.getY()));
    	}else if(enemigo!=null){
			final int distYoEnemigo=18;
			
			final Linea linea = new Linea(enemigo,bola);
			if(linea!=null && !Double.isInfinite(linea.getM())){
				if(bola.getX()>enemigo.getX()){
					comandos.add(irA(enemigo.getX()+distYoEnemigo , linea.calcularY(enemigo.getX()+distYoEnemigo).getY()));
				}else{
					comandos.add(irA(enemigo.getX()-distYoEnemigo , linea.calcularY(enemigo.getX()-distYoEnemigo).getY()));
				}
			}else{
				comandos.add(irAPosicionInicial());
			}
		}else{
			comandos.add(irAPosicionInicial());
		}
	}
	
	protected void generarAccion(final Vector<Comando> comandos) {
		Point[] mi_Equipo = getSituacion().getMisJugadores();

		int solucion = Entrenador.CEN_MED_BAJO;
		int min = Densidad_Jugadores(getPosicion(), mi_Equipo[5].getLocation());;
		
		for(int i=Entrenador.DEF_BAJO;i<=Entrenador.CEN_ALTO;i++){
			if (i!=getNumero()){
				int temp = Densidad_Jugadores(getPosicion(), mi_Equipo[i]);
				if ((min > temp) && mi_Equipo[i].x>getPosicion().x && mi_Equipo[i].distance(mi_Equipo[getNumero()])>40){
					min=temp;
					solucion=i;
				}
			}
		}
		comandos.add(pase(solucion));
	}
}
